#!/usr/bin/env node

const readline = require('readline');
const { execSync } = require('child_process');
const fs = require('fs');

// 创建readline接口
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

// 颜色输出
const colors = {
  reset: '\x1b[0m',
  bright: '\x1b[1m',
  green: '\x1b[32m',
  yellow: '\x1b[33m',
  blue: '\x1b[34m',
  red: '\x1b[31m',
  cyan: '\x1b[36m'
};

function log(message, color = 'reset') {
  console.log(colors[color] + message + colors.reset);
}

function exec(command) {
  try {
    return execSync(command, { encoding: 'utf8' });
  } catch (error) {
    return error.stdout || error.stderr || '';
  }
}

function question(prompt) {
  return new Promise((resolve) => {
    rl.question(prompt, resolve);
  });
}

async function main() {
  console.clear();
  log('═══════════════════════════════════════', 'cyan');
  log('        Git 提交工具 v1.0', 'bright');
  log('═══════════════════════════════════════', 'cyan');
  console.log();

  // 检查是否是git仓库
  const isGitRepo = exec('git rev-parse --is-inside-work-tree 2>&1').trim();
  if (isGitRepo !== 'true') {
    log('❌ 当前目录不是Git仓库！', 'red');
    rl.close();
    process.exit(1);
  }

  // 显示当前状态
  log('📊 当前Git状态:', 'blue');
  console.log('─────────────────────────────────────');
  const status = exec('git status --short');
  if (status.trim()) {
    console.log(status);
  } else {
    log('   ✓ 工作区干净，没有修改', 'green');
    console.log();
    const continueAnyway = await question('是否继续提交？(y/n): ');
    if (continueAnyway.toLowerCase() !== 'y') {
      log('\n👋 已取消操作', 'yellow');
      rl.close();
      return;
    }
  }
  console.log('─────────────────────────────────────');
  console.log();

  // 读取当前package.json版本
  let currentVersion = '0.0.0';
  try {
    const packageJson = JSON.parse(fs.readFileSync('./package.json', 'utf8'));
    currentVersion = packageJson.version || '0.0.0';
  } catch (e) {
    // 忽略错误
  }

  // 输入版本号
  log(`📌 当前版本: ${currentVersion}`, 'cyan');
  const version = await question('请输入新版本号 (直接回车跳过): ');
  const versionTag = version.trim();

  // 输入提交信息
  console.log();
  log('📝 请输入提交信息:', 'blue');
  const commitMsg = await question('> ');

  if (!commitMsg.trim()) {
    log('\n❌ 提交信息不能为空！', 'red');
    rl.close();
    process.exit(1);
  }

  // 构建最终提交信息（如果有版本号，则添加到前面）
  const finalCommitMsg = versionTag ? `v${versionTag} ${commitMsg.trim()}` : commitMsg.trim();

  console.log();
  log('─────────────────────────────────────', 'yellow');
  log('📋 提交摘要:', 'bright');
  if (versionTag) {
    log(`   版本号: ${versionTag}`, 'cyan');
  }
  log(`   完整提交信息: ${finalCommitMsg}`, 'cyan');
  log('─────────────────────────────────────', 'yellow');
  console.log();

  const confirm = await question('确认提交？(y/n): ');

  if (confirm.toLowerCase() !== 'y') {
    log('\n👋 已取消操作', 'yellow');
    rl.close();
    return;
  }

  console.log();
  log('🚀 开始执行...', 'green');
  console.log();

  try {
    // 1. 如果有版本号，更新package.json
    if (versionTag) {
      log('1️⃣  更新版本号到 package.json...', 'blue');
      exec(`npm version ${versionTag} --no-git-tag-version`);
      log('   ✓ 版本号已更新', 'green');
    } else {
      log('1️⃣  跳过版本号更新', 'yellow');
    }

    // 2. 添加所有修改
    log('2️⃣  添加文件到暂存区 (git add .)...', 'blue');
    exec('git add .');
    log('   ✓ 文件已暂存', 'green');

    // 3. 提交
    log('3️⃣  提交更改...', 'blue');
    const commitCommand = `git commit -m "${finalCommitMsg.replace(/"/g, '\\"')}"`;
    const commitResult = exec(commitCommand);
    log('   ✓ 提交成功', 'green');

    // 4. 创建tag（如果有版本号）
    if (versionTag) {
      log('4️⃣  创建版本标签...', 'blue');
      exec(`git tag -a v${versionTag} -m "${finalCommitMsg.replace(/"/g, '\\"')}"`);
      log(`   ✓ 标签 v${versionTag} 已创建`, 'green');
    }

    console.log();
    log('═══════════════════════════════════════', 'green');
    log('           ✅ 提交完成！', 'bright');
    log('═══════════════════════════════════════', 'green');
    console.log();

    // 询问是否推送
    const shouldPush = await question('是否推送到远程仓库？(y/n): ');
    if (shouldPush.toLowerCase() === 'y') {
      console.log();
      log('📤 推送到远程仓库...', 'blue');

      // 推送代码
      const pushResult = exec('git push');
      log('   ✓ 代码已推送', 'green');

      // 推送标签（如果有）
      if (versionTag) {
        exec(`git push origin v${versionTag}`);
        log('   ✓ 标签已推送', 'green');
      }

      console.log();
      log('🎉 全部完成！', 'green');
    } else {
      console.log();
      log('💡 提示: 稍后可以使用以下命令推送:', 'yellow');
      log('   git push', 'cyan');
      if (versionTag) {
        log(`   git push origin v${versionTag}`, 'cyan');
      }
    }

  } catch (error) {
    console.log();
    log('❌ 操作失败！', 'red');
    log(error.message, 'red');
    process.exit(1);
  }

  rl.close();
}

// 运行主函数
main().catch(error => {
  console.error(error);
  rl.close();
  process.exit(1);
});
